package com.squirrel.michale.search1;


/**
 * @author guanhao 观浩
 * @version 1.0.0.0
 * @createTime 2023/1/18 12:15 PM
 * @company Michale Squirrel
 * @link
 * @description
 */

/**
 * 认证题目：2019-12-06生产线消耗电容速度
 *
 * 电容对于终端来说是原材料当中的易耗品，现把仓库中的电容分成 N 份，第 i 份有 parts[i] 个电容。假如：
 *
 * 1.   生产线要消耗完一份电容，才能开始消耗下一份；
 *
 * 2.  生产线每分钟可消耗 K  个；如果某一份的电容数量小于 K 个，则生产线在这一分钟内消耗完这份电容后，剩余时间就会空闲，直到下一分钟开始消耗下一份。
 *
 * 距离下批电容上线前有 lengthTime 分钟，请计算在下批电容上线前，消耗完当前所有电容的最小速度 K（个/分钟，K 为整数）。
 *
 * 示例 1：
 *
 * 输入: parts = [3,6,7,11], lengthTime = 8
 *
 * 输出: 4
 *
 * 解释: 假如速度是 4 个/分钟的话：第 1 份 parts[0] 消耗 1 分钟，第 2 份 parts[1] 消耗 2 分钟，第 3 份 parts[2] 消耗 2 分钟，第 4 份 parts[3] 消耗 3 分钟，合计 8 分钟，符合要求。如果速度是 3 个/分钟的话，则需要 10 分钟，超过时间（8）要求；如果是 5 个/分钟的话，也是在 8 分钟内消耗完、满足时间要求，但是比 4 个/分钟速度快，不是最小速度。
 *
 *
 *
 * 限制：
 *
 * 1 <= parts.length <= 10^4
 *
 * parts.length <= lengthTime <= 10^9
 *
 * 1 <= parts[i] <= 10^9
 */
public class MinConsumingSpeed {


    public static int minConsumingSpeed(int[] parts,int lengthTime) {

        int left = 1;
        int right = getMax(parts);
        int k = Integer.MAX_VALUE;

        int middle = 0;

        while (left <= right) {
            middle = left + ((right - left) >> 1);
            int consumingTime = getConsumingTime(parts, middle);
            if (lengthTime >= consumingTime) {
                right = middle-1;
                k = Math.min(k, middle);
            } else {
                left = middle+1;
            }
        }
        return k;



    }


    private static int getConsumingTime(int[] parts,int speed) {
        int sum = 0;
        for (int i = 0; i < parts.length; i++) {
            sum += parts[i] / speed + (parts[i]%speed >0 ? 1:0);
        }
        return sum;
    }

    private static int getMax(int[] parts) {

        int max = 0;
        for (int i = 0; i < parts.length; i++) {
            if (parts[i] > max) {
                max = parts[i];
            }
        }

        return max;

    }


    public static void main(String[] args) {
        int[] parts = new int[]{3,6,7,11};
        int lengthTime = 8;
        System.out.println(minConsumingSpeed(parts, lengthTime));
    }

}
